package opf5.persistencia;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Equipo;
import opf5.entities.dominio.Infraccion;
import opf5.entities.dominio.Inscripcion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.dominio.Propuesta;
import opf5.persistencia.proxies.CalificacionDBProxy;
import opf5.persistencia.proxies.EquipoDBProxy;
import opf5.persistencia.proxies.InfraccionDBProxy;
import opf5.persistencia.proxies.InscripcionDBProxy;
import opf5.persistencia.proxies.JugadorDBProxy;
import opf5.persistencia.proxies.PartidoDBProxy;
import opf5.persistencia.proxies.PropuestaDBProxy;

public class OPF5DBGateway {
	public static void crearJugador(JugadorDBProxy jugador) {
/*		System.out.println("\nCreando jugador... Grabando en tabla Jugadores\n"
				+ "Id: " + jugador.getNombre() + "\n");
*/		
		crear(jugador);
	}

	public static void agregarInfraccion(JugadorDBProxy jugador, InfraccionDBProxy infraccion) {
/*		System.out.println("\nRelacionando infraccion con jugador\n"
				+ "Id: " + jugador.getNombre() + "\n"
				+ "Fecha: " + infraccion.getFechaInfraccion().toString() + "\n"
				+ "Motivo: " + infraccion.getMotivo() + "\n");
*/		
		infraccion.setNombre_jugador(jugador.getNombre());
		crear(infraccion);
	}

	public static void guardarJugador(JugadorDBProxy jugador) {
/*		System.out.println("\nActualizando jugador... Grabando en tabla Jugadores\n"
				+ "Id: " + jugador.getNombre() + "\n"
				+ "Email: " + jugador.getEmail() + "\n"
				+ "Fecha de nacimiento: " + jugador.getFechaNac().toString() + "\n"
				+ "Handicap: " + jugador.getHandicap() + "\n");
*/		
		guardar(jugador);
	}

	public static void agregarCalificacion(JugadorDBProxy jugador, CalificacionDBProxy calificacion) {
/*		System.out.println("\nRelacionando calificacion con jugador\n"
				+ "Jugador calificado: " + jugador.getNombre() + "\n"
				+ "Nota: " + Integer.toString(calificacion.getNota()) + "\n"
				+ "Comentario: " + calificacion.getComentario() + "\n");
*/
		calificacion.setNombreJugador(jugador.getNombre());
		crear(calificacion);
	}

	public static void guardarEquipo(EquipoDBProxy equipodb) {
//		System.out.println("\nActualizando equipo... Grabando en tabla Equipos\n");
		guardar(equipodb);
	}

	public static void crearEquipo(EquipoDBProxy equipodb) {
//		System.out.println("\nCreando equipo... Grabando en tabla Equipos\n");
		crear(equipodb);
	}

	public static void crearPartido(PartidoDBProxy partidodb) {
//		System.out.println("\nCreando partido... Grabando en tabla Partidos\n");
		crear(partidodb);
	}

	public static void agregarInscripcionAPartido(PartidoDBProxy partido, InscripcionDBProxy nuevaInscripcion) {
//		System.out.println("\nRelacionando inscripcion con partido...\n");
		nuevaInscripcion.setIdpartido(partido.getId());
		crear(nuevaInscripcion);
	}

	public static void guardarPartido(PartidoDBProxy partidoDBProxy) {
//		System.out.println("\nActualizando partido... Grabando en tabla Pardido\n");
		guardar(partidoDBProxy);
	}

	public static void agregarEquipos(PartidoDBProxy partidoDBProxy, EquipoDBProxy equipo1, EquipoDBProxy equipo2) {
//		System.out.println("\nRelacionando partido con equipos... Grabando en tabla Pardido\n");
		crearEquipo(equipo1);
		crearEquipo(equipo2);
		guardar(partidoDBProxy);
	}

	public static void removerInscripcion(PartidoDBProxy partidoDBProxy,
			InscripcionDBProxy inscripcion) {
//		System.out.println("\nRemoviendo inscripcion de partido\n");	
		borrar(inscripcion);
	}

	public static void crearInscripcion(InscripcionDBProxy inscripciondb) {
//		System.out.println("\nCreando inscripcion... Grabando en tabla Inscripciones\n");
		
		crear(inscripciondb);
	}
	
	
	
	
	
	public static List<Partido> getPartidos() {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from PARTIDOS")	
				.addEntity(PartidoDBProxy.class);
 
		List<Partido> partidos = query.list();

		return partidos;
	}	
	
	public static List<Inscripcion> getInscripcionesPartido(PartidoDBProxy p) {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from INSCRIPCIONES where idpartido = (:idp)")
				.addEntity(InscripcionDBProxy.class)
				.setParameter("idp", p.getId());
 
		List<Inscripcion> inscripciones = query.list();
		
		return inscripciones;
	}


	public static List<Jugador> getJugadores() {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from JUGADORES")	
				.addEntity(JugadorDBProxy.class);
 
		List<Jugador> jugadores = query.list();

		return jugadores;
	}	
	
	
	public static List<Calificacion> getCalificacionesJugador(Jugador j) {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from CALIFICACIONES where nombreJugador = (:nj)")	
				.addEntity(CalificacionDBProxy.class)
				.setParameter("nj", j.getNombre());
		
		List<Calificacion> calificaciones = query.list();
		return calificaciones;
	}

	public static List<Infraccion> getInfraccionesJugador(Jugador j) {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from INFRACCIONES where nombre_jugador = (:nj)")	
				.addEntity(InfraccionDBProxy.class)
				.setParameter("nj", j.getNombre());
		
		List<Infraccion> infracciones = query.list();
		return infracciones;
	}

	public static List<Jugador> buscarJugadores(String consulta) {
		Query query = OPF5SessionManager.getSession().createSQLQuery(consulta)
				.addEntity(JugadorDBProxy.class);
 
		List<Jugador> jugadores = query.list();
		
		return jugadores;
	}

	
	
	public static void crear(Object objeto) {
//		System.out.println("Antes del save");

		Session session = OPF5SessionManager.getSession();
		
		Transaction tx = session.beginTransaction();
		
		session.save(objeto);

		tx.commit();
		
		session.close();
		
//		System.out.println("Despues del save");

	}

	
	public static void borrar(Object objeto) {
//		System.out.println("Antes del save");

		Session session = OPF5SessionManager.getSession();
		
		Transaction tx = session.beginTransaction();
		
		session.delete(objeto);

		tx.commit();
		
		session.close();
		
//		System.out.println("Despues del save");

	}


	public static void guardar(Object objeto) {
//		System.out.println("Antes del update");

		Session session = OPF5SessionManager.getSession();
		
		Transaction tx = session.beginTransaction();		
		
		session.update(objeto);

		tx.commit();
		
		session.close();
		
//		System.out.println("Despues del update");

	}

	public static Equipo getEquipo(int i) {
		Query query = OPF5SessionManager.getSession().createSQLQuery("select * from EQUIPOS where idequipo = (:ide)")
				.addEntity(EquipoDBProxy.class)
				.setParameter("ide", i);

		return (Equipo) query.list().get(0);
	}

	public static Partido getPartido(int id) {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from PARTIDOS where id = (:pid)")
				.addEntity(PartidoDBProxy.class)
				.setParameter("pid", id);
 
		List<Partido> partidos = query.list();
		return partidos.get(0);
	}

	public static void crearPropuesta(PropuestaDBProxy propuesta) {
		propuesta.setEstadoPropuesta("En Espera");
		crear(propuesta);
	}

	public static void rechazarPropuesta(PropuestaDBProxy propuesta) {
		propuesta.setEstadoPropuesta("Rechazada");
		guardar(propuesta);
	}

	public static void aprobarPropuesta(PropuestaDBProxy propuesta) {
		propuesta.setEstadoPropuesta("Aprobada");
		guardar(propuesta);
	}

	public static List<PropuestaDBProxy> getPropuestas() {
		Query query = OPF5SessionManager.getSession().createSQLQuery(
				"select * from PROPUESTAS")
				.addEntity(PropuestaDBProxy.class);
 
		List<PropuestaDBProxy> propuestas = query.list();
		return propuestas;
	}
}
